package com.tiancheng.trade.settlement.mapper.settlement;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tiancheng.trade.settlement.bo.ProductBO;
import com.tiancheng.trade.settlement.mapper.TYBaseMapper;
import com.tiancheng.trade.settlement.model.settlement.SettlementBillResult;
import com.tiancheng.trade.settlement.vo.settlement.admin.AbnormalDataQueryVO;
import com.tiancheng.trade.settlement.vo.settlement.admin.SettlementBillHandleVO;
import com.tiancheng.trade.settlement.vo.settlement.admin.StatementAccountCreateVO;
import com.tiancheng.trade.settlement.vo.settlement.admin.SuccessBillQueryVO;
import com.tiancheng.trade.settlement.vo.settlement.admin.res.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 清分对账结果表（成功和异常的都在这里
 *
 * @author chris.shao
 * @since 2024/4/20
 */
@Repository
public interface SettlementBillResultMapper extends TYBaseMapper<SettlementBillResult> {
    /**
     * 获取正确的对账结果
     *
     * @param subOrderKeys
     * @return
     */
    List<SettlementBillResult> getReconciliationResult(@Param("list") List<String> subOrderKeys, @Param("rematch") String rematch);

    /**
     * 获取异常的对账结果
     *
     * @param subOrderKeys
     * @return
     */
    List<SettlementBillResult> getExceptionReconciliationResult(@Param("list") List<String> subOrderKeys, @Param("rematch") String rematch);

    /**
     * 查询我方有银行无的待对账单
     *
     * @param
     * @return
     */
    List<SettlementBillResult> queryBankNothingList();

    /**
     * 查询我方有银行无的账单(轮询时去结果表查询)
     *
     * @param
     * @return
     */
    List<SettlementBillResult> pollingQueryBankNothingList();

    /**
     * 查询我方有银行也有，但对账异常的数据
     *
     * @return
     */
    List<SettlementBillResult> queryBankErrorList(List<String> errorSubOrderIds);

    /**
     * 我方有银行无的账单对账
     *
     * @param
     * @return
     */
    List<SettlementBillResult> pollingBill(List<String> subOrderKeys);

    /**
     * 各种场景都回掏后，银行有我方无的数据(可能是旧数据)
     *
     * @param
     * @return
     */
    List<SettlementBillResult> selectPollingNoDataBankColumn(List<String> subOrderKeys);

    /**
     * 匹配清分规则后对完账，修改已对账过的账单数据
     *
     * @param
     * @return
     */
    int updateBillResult(SettlementBillResult result);

    /**
     * 银行账单未匹配到数据时，去结果表查询是否由于银行晚给数据，导致原数据已对账但未匹配到结果，重新进行对账
     *
     * @param subOrderKeys
     * @return
     */
    List<SettlementBillResult> bankAndPlatformReconciliations(List<String> subOrderKeys);

    /**
     * 如果银行有数据且我方有数据，则带上对应条件进行判断，金额不匹配则算异常
     *
     * @param subOrderKeys
     * @return
     */
    List<SettlementBillResult> bankAndPlatformExceptionReconciliations(List<String> subOrderKeys);

    /**
     * 查询已手工备注过的数据
     *
     * @param subOrderKeys
     * @return
     */
    List<SettlementBillResult> queryManualNotesData(List<String> subOrderKeys);

    /**
     * 查询银行有我方无时，需要去记录账单异常的数据
     *
     * @return
     */
    List<SettlementBillResult> queryRuleIsNullBillData(List<String> subOrderKeys);

    /**
     * 我方有银行无时，查询出银行的数据更新到结果表
     *
     * @param
     * @return
     */
    int updateBankDataToResult(SettlementBillResult result);

    /**
     * 修改我方账单轮询次数
     *
     * @param
     * @return
     */
    int updateBillCount(List<String> subOrderKeys);

    /**
     * 批量保存
     *
     * @param results
     * @return
     */
    int batchSave(List<SettlementBillResult> results);


    IPage<SuccessBillResVO> querySuccessBillView(Page<?> page, @Param("vo") SuccessBillQueryVO queryVO);

    List<SuccessBankResVO> querySuccessBankView(@Param("list") List<String> subOrders, @Param("vo") SuccessBillQueryVO queryVO);

    List<SuccessBillResVO> successBillExport(@Param("vo") SuccessBillQueryVO queryVO);

    IPage<AbnormalDataResVO> queryAbnormalDataList(@Param("page") Page<?> page, @Param("vo") AbnormalDataQueryVO queryVO);

    SettlementBillResult querySubOrderSettlementInfoBySubOrderId(SettlementBillResult param);

    /**
     * 查询对账函商户信息
     *
     * @param queryVO
     * @return
     */
    List<StatementProductResVO> queryStatementAccount(@Param("vo") StatementAccountCreateVO queryVO);

    /**
     * 查询对账函产品信息
     *
     * @param queryVO
     * @return
     */
    List<StatementProductResVO> queryStatementProduct(@Param("vo") StatementAccountCreateVO queryVO);

    /**
     * 根据日期查询核销金额成本信息
     * 商品成本价格
     *
     * @param date
     * @return
     */
    List<SettlementBankAmountResVO> getBankAmount(@Param("date") String date);

    /**
     * 无合同信息
     * 根据日期查询核销金额成本信息
     * 商品成本价格
     *
     * @param date
     * @return
     */
    List<SettlementBankAmountResVO> getNoContractBankAmount(@Param("date") String date);

    /**
     * 根据日期查询清分成本差异及差异原因
     * 商品成本价格
     *
     * @param date
     * @return
     */
    List<SettlementBankAmountResVO> getDiffAmount(@Param("date") String date);

    /**
     * 无合同信息
     * 根据日期查询清分成本差异及差异原因
     * 商品成本价格
     *
     * @param date
     * @return
     */
    List<SettlementBankAmountResVO> getNoContractDiffAmount(@Param("date") String date);

    /**
     * 批量更新旧系统的数据状态
     *
     * @param vo
     * @return
     */
    int updateOldSystemDataStatus(@Param("vo") SettlementBillHandleVO vo);

    int selectBankSubOrderIdIsNullData();

    int updateBankNothing();

    List<AbnormalDataResVO> getResultByIds(@Param("list") List<String> ids);

    int updateErrorAmount(List<String> subOrderKeys);

    int updateBillResultProduct(ProductBO bo);

}